/**
 * Copyright 厦门中软海晟信息技术有限公司 版权所有 违者必究 2019
 */
package com.vijos;

/**
 * @author : sunzb(sunzb@hsit.com.cn)
 * @date: 2019/4/19
 */
//最小公倍数和最大公约数问题
//    输入二个正整数,求出满足下列条件的P、Q的个数
//    1.P、Q是正整数
//    2.P、Q以xO为最大公约数，以yO为最小公倍数
//    试求，满足条件的所有可能的两个正整数的个数。
public class P7_1_1131 {

    public static int test(int a, int b) {
        dataVerify(a, b);
        int count = 0;
        for (int p = a; p <= b; p++) {
            for (int q = a; q <= b; q++) {
                if (p == q) {
                    continue;
                }
                int gys = getGys(p, q);
                int gbs = getGbs(p, q);
                if (gys == a && gbs == b) {
                    count++;
                }
            }
        }
        return count;
    }

    private static void dataVerify(int a, int b) {
        if (b % a != 0) {
            throw new RuntimeException("最小公倍数除以最小公约数有余数，数据无效");
        }
    }

    // 最大公约数
    public static int getGys(int n1, int n2) {
        int gcd = 0;
        if (n1 < n2) {// 交换n1、n2的值
            n1 = n1 + n2;
            n2 = n1 - n2;
            n1 = n1 - n2;
        }
        if (n1 % n2 == 0) {
            gcd = n2;
        }
        while (n1 % n2 > 0) {
            n1 = n1 % n2;
            if (n1 < n2) {
                n1 = n1 + n2;
                n2 = n1 - n2;
                n1 = n1 - n2;
            }
            if (n1 % n2 == 0) {
                gcd = n2;
            }
        }
        return gcd;
    }

    // 最小公倍数
    public static int getGbs(int n1, int n2) {
        return n1 * n2 / getGys(n1, n2);
    }


    public static void main(String[] args) {
        System.out.println(test(3, 60) == 4);
    }
}
